home *** CD-ROM | disk | FTP | other *** search
/ ADA Programming Guide / ADA Programming Guide.iso / adasmall / race.ada < prev    next >
Text File  |  1996-01-30  |  5KB  |  212 lines

  1. with SMALL_SP; use SMALL_SP;
  2. procedure RACE is
  3. ------------------------------------------------------------------------------
  4. -- Sort race demonstration program for THE AVL PARALLEL MONITORING           -
  5. -- WITH                                SmallAda Version 2.0.                 -
  6. ------------------------------------------------------------------------------
  7. STIME : FLOAT;
  8. task BUBBLE_SORT is
  9.   entry S(r : in INTEGER; t : in FLOAT);
  10.   entry X;
  11. end BUBBLE_SORT;
  12.  
  13. task INSERT_SORT is
  14.   entry S(r : in INTEGER; t : in FLOAT);
  15.   entry X;
  16. end INSERT_SORT;
  17.  
  18. task SHELL_SORT is
  19.   entry S(r : in INTEGER; t : in FLOAT);
  20.   entry X;
  21. end SHELL_SORT;
  22.  
  23. task SCREEN is
  24.   entry P(X,Y : in INTEGER; C : in CHARACTER);
  25.   entry place(who : integer);
  26.   entry conclude;
  27. end SCREEN;
  28.  
  29. task body SCREEN is
  30.   position : integer := 0;
  31. begin
  32. loop
  33.   select
  34.     accept P(X,Y : in INTEGER; C : in CHARACTER) do
  35.       CURSORAT(X,Y);
  36.       PUT(C);
  37.     end P;
  38.   or
  39.     accept place(who : integer) do
  40.       CURSORAT(who,50);
  41.       IF POSITION = 0 THEN
  42.          PUT("FIRST");
  43.       ELSIF POSITION = 1 THEN
  44.          PUT("SECOND");
  45.       ELSE
  46.          PUT("LAST");
  47.          CURSORAT(18,1);
  48.       END IF;
  49.       POSITION := POSITION + 1;
  50.     end place;
  51.   or
  52.     when position = 3 =>
  53.         accept conclude;
  54.   or
  55.     terminate ;
  56.   end select ;
  57. end loop;
  58. end SCREEN;
  59.  
  60. task body SHELL_SORT is
  61.   B          : STRING(0..25);
  62.   TEMP       : CHARACTER;
  63.   I
  64.  ,J
  65.  ,STEP       : INTEGER;
  66.   STEPSIZE   : array(1..4) OF INTEGER;
  67.   STOP       : BOOLEAN;
  68.   ROW        : INTEGER;
  69.   STIME      : FLOAT;
  70. begin
  71.   B := "ZYXWVUTSRQPONMLKJIHGFEDCBA";
  72.   -- Accept call from "main"
  73.   accept S(r : in INTEGER; t : in FLOAT) do
  74.     ROW   := r;
  75.     STIME := t;
  76.   end S;
  77.   for k in 0..25 loop
  78.     SCREEN.P(ROW,14+k,B(k));
  79.   end loop;
  80.   -- 'steps' contains decreasing increments for each
  81.   -- pass. The last pass has increment 1.
  82.   STEPSIZE(4) := 1;
  83.   for PASS in reverse 1..3 loop
  84.     STEPSIZE(PASS):= 2*STEPSIZE(PASS+1);
  85.   end loop;
  86.  
  87.   delay STIME - CLOCK;
  88.   for PASS in 1..4 loop
  89.     STEP := STEPSIZE(PASS);
  90.     -- Do a straight insertion sort with 'step' as
  91.     -- an increment instead of 1.
  92.     I := STEP;
  93.     while (I <= 25) loop
  94.       TEMP := B(I);
  95.       J    := I;
  96.       STOP := FALSE;
  97.       while (J > STEP-1) and (STOP /= TRUE) loop
  98.         J := J - STEP;
  99.         if B(J) > TEMP then
  100.           B(J+STEP) := B(J);
  101.           SCREEN.P(ROW, 14+J, TEMP);
  102.         else
  103.           B(J+STEP) := TEMP;
  104.           STOP := TRUE;
  105.         end if;
  106.         SCREEN.P(ROW,14+(J+STEP),B(J+STEP));
  107.       end loop;
  108.       if (not STOP) then
  109.         B(0) := TEMP;
  110.         SCREEN.P(ROW,14,B(0));
  111.       end if;
  112.       I := I + STEP;
  113.     end loop;
  114.   end loop; -- for pass in 1..npass
  115.   SCREEN.PLACE(ROW);
  116. end SHELL_SORT;
  117.  
  118. task body BUBBLE_SORT is
  119.   B     : STRING(0..25);
  120.   TEMP  : CHARACTER;
  121.   I, J  : INTEGER;
  122.   ROW   : INTEGER;
  123.   STIME : FLOAT;
  124. begin
  125.   B := "ZYXWVUTSRQPONMLKJIHGFEDCBA";
  126.   -- Accept call from "main"
  127.   accept S(r : in INTEGER; t : in FLOAT) do
  128.     ROW := r;
  129.     STIME := t;
  130.   end S;
  131.   for k in 0..25 loop
  132.     SCREEN.P(ROW,14+k,B(k));
  133.   end loop;
  134.   delay STIME - CLOCK;
  135.   I:= 25;
  136.   while (I > 0) loop
  137.     J:= 0;
  138.     while (J < I) loop
  139.       if B(J) > B(J+1) then
  140.         TEMP:= B(J+1);
  141.         B(J+1):= B(J);
  142.         B(J):= TEMP;
  143.         SCREEN.P(ROW,14+J  ,B(J  ));
  144.         SCREEN.P(ROW,14+J+1,B(J+1));
  145.       end if;
  146.       J:= J+1;
  147.     end loop;
  148.     I:= I-1;
  149.   end loop;
  150.   SCREEN.PLACE(ROW);
  151. end BUBBLE_SORT;
  152.  
  153. task body INSERT_SORT is
  154.   B     : STRING(0..25);
  155.   TEMP  : CHARACTER;
  156.   J     : INTEGER;
  157.   STOP  : BOOLEAN;
  158.   ROW   : INTEGER;
  159.   STIME : FLOAT;
  160. BEGIN
  161.   B := "ZYXWVUTSRQPONMLKJIHGFEDCBA";
  162.   -- Accept call from "main"
  163.   accept S(r : in INTEGER; t : in FLOAT) do
  164.     ROW   := r;
  165.     STIME := t;
  166.   end S;
  167.   for k in 0..25 loop
  168.     SCREEN.P(ROW,14+k,B(k));
  169.   end loop;
  170.   delay STIME - CLOCK;
  171.   for I in 0..25 loop
  172.     TEMP := B(I);
  173.     J    := I;
  174.     STOP := FALSE;
  175.     while (J > 0) and (not STOP) loop
  176.       J := J - 1;
  177.       if (B(J) > TEMP) then
  178.         B(J+1):= B(J);
  179.       else
  180.         B(J+1):= TEMP;
  181.         STOP  := TRUE;
  182.       end if;
  183.       SCREEN.P(ROW, 14+(J+1) ,B(J+1));
  184.     end loop;
  185.     if (not STOP) then
  186.       B(0) := TEMP;
  187.       SCREEN.P(ROW ,14 ,B(0));
  188.     end if;
  189.   end loop;
  190.   SCREEN.PLACE(ROW);
  191. end INSERT_SORT;
  192.  
  193.  
  194.  
  195. begin
  196.   CURSORAT(3,1);
  197.   PUT("Bubble:");
  198.   CURSORAT(5,1);
  199.   PUT("Insertion:");
  200.   CURSORAT(7,1);
  201.   PUT("Shell:");
  202.   STIME := CLOCK + 10.0;
  203.   -- Start Bubble
  204.   BUBBLE_SORT.S(3,STIME);
  205.   -- Start Insert
  206.   INSERT_SORT.S(5,STIME);
  207.   -- Start Shell
  208.   SHELL_SORT.S(7,STIME);
  209.   -- Wait until the "race" finish
  210.   SCREEN.conclude;
  211. end RACE;
  212.